计算机系统基础(三)

IA-32指令类型

IA-32的标志寄存器

  • 6个条件标志

OF (Overflow Flag) 溢出标志位
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。

SF (Sign Flag) 符号标志
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。

ZF (Zero Flag) 零标志
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

CF (Carry Flag) 进位标志
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。

AF (Auxiliary Carry Flag) 辅助进位标志
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:

  1. 在字操作时,发生低字节向高字节进位或借位时;
  2. 在字节操作时,发生低4位向高4位进位或借位时。

PF(Parity Flag) 奇偶标志
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。

  • 3个控制标志

DF (Direction Flag) 方向标志(自动变址方向是增还是减)
方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。

IF (Interruput Flag) 中断允许标志(仅对外部可屏蔽中断有用)
中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。

  1. 当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
  2. 当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。

TF (Trap Flag) 陷阱标志(是否是单步跟踪状态)
当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。

IA-32b标志.png

IA-32 指令系统概述

  • IA-32是典型的CISC(复杂指令集计算机)风格ISA

8个通用寄存器

2个专用寄存器:

  1. EIP(PC) EIP寄存器主要用于存放当前代码段即将被执行的下一条指令的偏移,但其本质上并不能直接被指令直接访问。
  2. 标志寄存器EFLAGS

6个段寄存器(间接给出段基址)

存储器地址空间为4GB,按字节编址,小端方式

寻址方式

  1. 立即
  2. 寄存器
  3. 存储器 段基址+有效地址(位移量)

    寻址方式.png
    [B]——基址寄存器编号 [I]——变址寄存器编号 s——比例因子 A——位移量 这些信息可以排列组合

    1. 相对寻址(指令)

变长指令字,变长操作码

  • 汇编语言格式
  1. Inter格式汇编
  2. AT&T格式汇编

Intel格式和AT&T格式汇编区别

IA-32指令类型

传送指令

  • 通用数据传送指令

MOV:一般传送

==注意: MOV指令不能在两个存储器之间进行数据直接传送。 MOV指令不能在两个段寄存器之间进行数据直接传送。==

MOVS:符号扩展传送

MOVZ: 零扩展传送

XCHG: 数据交换

PUSH/POP: 入栈/出栈

  • 地址传送指令

LEA 加载有效地址

  • 输入输出指令

IN和OUT: I/O端口与寄存器之间的交换

  • 标志传送指令

PUSHF、POPF: 将EFLAG压栈,将栈顶内容送入EFLAG

定点算术运算指令

  • 加减(影响标志,不区分无/带符号)

ADD SUB

  • 增1/减1运算(影响除CF以外的标志,不区分无/带符号)

INC DEC

  • 取负运算(影响标志,若对0取负,则结果为0且CF清0,否则CF置1)

NEG

  • 比较运算(做减法得到标志,不区分无/带符号)

CMP

  • 乘/除运算(不影响标志,区分无/带符号)

MUL/IMUL 无符号乘/带符号乘

DIV/IDIV 无符号除/带符号除

定点运算指令汇总.png

按位运算

  • 逻辑运算

NOT 非

AND 与

OR 或

XOR 异或

TEST 做“与”测试,仅影响标志

  • 移位运算 (左/右移时,最高/最低位送CF)

SHL/SHR:逻辑左/右移

SAL/SAR: 算术左/右移 左移判溢出,右移高位补符

ROL/ROR 循环左/右移

RCL/RCR 带进位循环左/右移

逆向工程.png

控制转移指令

  • 无条件转移指令

JMP DST 无条件转移到目标指令DST处执行

  • 条件转移

Jcc DST cc为条件码,根据标志(条件码)判断是否满足条件,若满足,则转移道目标指DST处执行,否则顺序执行

  • 条件设置

SETcc DST 按条件码cc判断的结果保存到DST(是一个8为寄存器)

  • 调用和返回指令(用于过程调用)
  • 中断指令

CALL DST 返回地址RA入栈,转DST处执行

RET 从栈中取出返回地址RA,转到RA处执行

控制.png

x87浮点处理指令

IA-32 的浮点处理架构.png

C语言语句的机器级表示

过程调用的机器级表示.png

过程(函数)的结构

一个C过程的大致结构如下

  1. 准备阶段
  • 形成帧底:push指令和mov指令

  • 生成栈帧(如果需要的话):sub指令或and指令

  • 保存现场(如果有被调用者保存寄存器): mov指令

  1. 过程(函数)体
  • 分配局部变量空间,并赋值

  • 具体处理逻辑,如果遇到函数调用时

    • 准备参数: 将实参送栈帧入口参数处
    • CLLL指令: 保存返回地址并转被调用函数
  • 在EAX中准备返回参数

  1. 结束阶段
  • 退栈: leave指令或pop指令

选择结构

选择结构的机器级表示.png

循环结构

循环结构的机器级语言表示.png

==为提高程序性能,能用非递归方式执行最好用非递归方式。==